// pages/login/add-info/index.ts
import { bindPhoneNumber, getOpenId, getPhoneNumber } from '../../../utils/api/login'
import { validateNull, formatTime, mySleep } from '../../../utils/util';
import { addBMI } from '../../../utils/api/BMIControl'
import userBaseInfoState from '../../../stores/userBaseInfo';
import { getPatientBaseObject, modPatientBaseObject } from '../../../utils/api/patientBase';
import Notify from 'pages/service-old/bind-doctor/node_modules/@vant/weapp/notify/notify';

Page({

  /**
   * 页面的初始数据
   */
  data: {
    user: <PatientBaseEntity>{
      patientName: <string | null>'',
      identificationNumber: <string | null>'',
      sex: <string | null>'请选择您的性别',
      birthday: <string | null>'请选择您的出生日期',
      phoneNumber: ''
    },
    openId: '',
    tmpbirthday: 0,
    isShowSexSelect: false,
    sexList: ['男性', '女性'],
    isShowDate: false,
    maxDate: new Date().getTime(),
    minDate: new Date(1910, 0, 1).getTime(),
    formatter(type: string, value: any) {
      if (type === 'year') {
        return `${value}年`;
      }
      if (type === 'month') {
        return `${value}月`;
      }
      return value;
    },
    height: '',
    weight: '',
    date: '',
    errorMessageHeight: '',
    errorMessageWeight: '',
    isRegesting: false
  },

  // 显示性别选择表单
  showSexSelect() {
    this.setData({
      isShowSexSelect: true,
    })
  },

  // 取消关闭性别选择表单
  cancelSexSelect() {
    this.setData({
      isShowSexSelect: false,
    })
  },

  // 更改性别选择表单中的内容
  changeSex(event: any) {
    const { picker, value, index } = event.detail;
    this.data.user.sex = value
    this.setData({
      user: this.data.user
    })
    console.log('确认性别:', this.data.user.sex);
    this.cancelSexSelect()
  },

  // 显示日期选择表单
  showDate() {
    this.setData({
      isShowDate: true,
    })
  },

  // 取消关闭日期选择表单
  cancelDate() {
    this.setData({
      isShowDate: false,
    })
  },

  // 更改日期选择表单中的内容
  changeBirthday(event: any) {
    this.setData({
      tmpbirthday: event.detail
    })
  },

  // 确认所选的生日日期
  confirmBirthday() {
    // 将时间戳变为日期
    let date1 = new Date(this.data.tmpbirthday);
    this.data.user.birthday = formatTime(date1, 'yyyy-MM-dd')
    this.setData({
      user: this.data.user,
    })
    this.cancelDate()
  },

  // 手动输入手机号
  onPhoneInput(event: any) {
    const phoneNumber = event.detail;
    this.setData({
      "user.phoneNumber": phoneNumber
    });
    console.log('手动输入手机号:', phoneNumber);
  },

  // 从微信获取用户手机号码和对应的wxuid
  getPhoneNumber(e: any) {
    if (e.detail.code) {
      // 访问远程服务
      getOpenId();
      const openId = wx.getStorageSync("openid");
      getPhoneNumber({ phoneCode: e.detail.code }).then(async (res: any) => {
        console.log("获取手机号成功", res)
        if (res.code == 1) {
          console.log("接口出现问题不应返回code==1");
          Notify({ type: 'warning', message: '微信授权失败，请手动输入手机号' });
          return;
        }
        const phoneNumber = <string>res.data;
        this.setData({
          "user.phoneNumber": phoneNumber,
          openId: openId
        })
        Notify({ type: 'success', message: '微信授权成功' });
      }).catch((err: any) => {
        console.log("获取手机号失败", err);
        Notify({ type: 'warning', message: '微信授权失败，请手动输入手机号' });
      })
    } else {
      console.log("手机号码组件调用失败");
      Notify({ type: 'warning', message: '授权取消，请手动输入手机号' });
    }
  },

  // 更新用户个人信息（异步版本）
  async modUserInfoAsync() {
    const data = <PatientBaseEntity>{
      patientUid: userBaseInfoState.data.patientUid,
      physicalStrength: userBaseInfoState.data.physicalStrength,
      phoneNumber: userBaseInfoState.data.phoneNumber,
      wxUid: userBaseInfoState.data.wxUid,
      username: userBaseInfoState.data.username,
      patientName: this.data.user.patientName,
      identificationNumber: this.data.user.identificationNumber,
      sex: this.data.user.sex,
      birthday: this.data.user.birthday
    };
    console.log('准备更新用户信息:', data);
    
    try {
      const res = await modPatientBaseObject(data);
      console.log('修改基本信息成功', res);
      // 更新全局状态
      userBaseInfoState.onChangeData(data);
      return res;
    } catch (err) {
      console.log("修改基本信息失败", err);
      throw err;
    }
  },

  // 更新用户个人信息（保留原方法供其他地方使用）
  modUserInfo() {
    this.modUserInfoAsync().then((res: any) => {
      Notify({ type: 'success', message: '基本信息提交成功' });
    }).catch((err: any) => {
      Notify({ type: 'danger', message: '个人信息提交失败，请前往我的进行修改' });
    })
  },

  // 输入个人信息
  onInput(event: any) {
    // 先判断类型
    const type = event.currentTarget.dataset.type
    if (type == 'name') {
      this.data.user.patientName = event.detail
    } else if (type == 'identificationNumber') {
      this.data.user.identificationNumber = event.detail
    } else if (type == 'sex') {
      this.data.user.sex = event.detail
    } else if (type == 'birthday') {
      this.data.user.birthday = event.detail
    } else if (type == 'phoneNumber ') {
      this.data.user.phoneNumber = event.detail
    } else {
      // 出现错误
      console.log('输入错误');
      return;
    }

    this.setData({
      user: this.data.user
    })
  },

  // 输入身高体重信息
  fieldOnChangeHeight(event: any) {
    let value = parseFloat(event.detail)
    if (isNaN(value)) {
      this.setData({
        height: '',
        errorMessageHeight: '输入数值异常'
      })
      return;
    }
    const max = 300;
    const min = 10;
    // 校验是否符合
    if (value < max && value > min) {
      this.setData({
        height: event.detail,
        errorMessageHeight: '',
      })
    } else {
      this.setData({
        height: event.detail,
        errorMessageHeight: '输入身高异常'
      })
    }
  },
  fieldOnChangeWeight(event: any) {
    let value = parseFloat(event.detail)
    if (isNaN(value)) {
      this.setData({
        weight: '',
        errorMessageWeight: '输入数值异常'
      })
      return;
    }
    const max = 200;
    const min = 10;
    // 校验是否符合
    if (value < max && value > min) {
      this.setData({
        weight: event.detail,
        errorMessageWeight: '',
      })
    } else {
      this.setData({
        weight: event.detail,
        errorMessageWeight: '输入体重异常'
      })
    }
  },

  // 提交BMI相关数据（异步版本）- 暂时注释，不需要BMI功能
  // async addRecordAsync() {
  //   console.log('确认添加BMI记录');
  //   
  //   // 验证身高体重
  //   if (!this.data.height || !this.data.weight) {
  //     console.log('身高或体重为空，跳过BMI记录');
  //     return { skipped: true };
  //   }
  //   
  //   // 验证 patientUid 是否存在
  //   if (!userBaseInfoState.data.patientUid) {
  //     console.warn('patientUid 不存在，跳过BMI记录');
  //     return { skipped: true };
  //   }
  //   
  //   const data = {
  //     patientUid: Number(userBaseInfoState.data.patientUid), // 确保是数字类型
  //     weight: parseFloat(this.data.weight),
  //     bmimeasurementDate: this.data.date,
  //     height: parseFloat(this.data.height),
  //   }
  //   
  //   console.log('BMI数据:', data);
  //   
  //   try {
  //     const res = await addBMI(data);
  //     console.log('BMI记录上传成功', res);
  //     return res;
  //   } catch (err) {
  //     console.error('BMI记录上传失败', err);
  //     // BMI记录失败不影响注册流程，只记录错误
  //     console.warn('BMI记录上传失败，但不影响注册，继续流程');
  //     return { error: err };
  //   }
  // },

  // 提交BMI相关数据（保留原方法供其他地方使用）- 暂时注释
  // addRecord() {
  //   this.addRecordAsync().then(async (res: any) => {
  //     Notify({ type: 'success', message: 'BMI数据上传成功，即将前往首页' })
  //     await mySleep(500)
  //     wx.switchTab({
  //       url: '/pages/home/index'
  //     });
  //   }).catch((err: any) => {
  //     console.log('BMI记录上传失败', err);
  //   })
  // },

  // 校验信息并注册提交
  async confirmInfo() {
    this.setData({
      isRegesting: true
    })
    
    // 确保获取openId
    if (!this.data.openId) {
      await getOpenId();
      const openId = wx.getStorageSync("openid");
      this.setData({
        openId: openId
      });
    }
    
    // 信息校验逻辑
    if (this.data.user.patientName == '') {
      Notify({ type: 'danger', message: '请输入您的姓名' });
      this.setData({
        isRegesting: false
      })
      return
    }
    if (this.data.user.sex == '请选择您的性别') {
      Notify({ type: 'danger', message: '请选择您的性别' });
      this.setData({
        isRegesting: false
      })
      return
    }
    if (this.data.user.birthday == '请选择您的出生日期') {
      Notify({ type: 'danger', message: '请选择您的出生日期' });
      this.setData({
        isRegesting: false
      })
      return
    }
    // 验证手机号
    if (!this.data.user.phoneNumber || this.data.user.phoneNumber.trim() === '') {
      Notify({ type: 'danger', message: '请输入手机号码或点击微信授权' });
      this.setData({
        isRegesting: false
      })
      return
    }
    // 简单验证手机号格式（11位数字）
    const phoneReg = /^1[3-9]\d{9}$/;
    if (!phoneReg.test(this.data.user.phoneNumber)) {
      Notify({ type: 'danger', message: '请输入正确的11位手机号码' });
      this.setData({
        isRegesting: false
      })
      return
    }
    
    // 身高体重验证（暂时注释，不需要BMI功能）
    // if (this.data.height == '') {
    //   Notify({ type: 'danger', message: '请输入您的身高数据' });
    //   this.setData({
    //     isRegesting: false
    //   })
    //   return
    // }
    // let value = parseFloat(this.data.height);
    // const max = 300;
    // const min = 10;
    // // 校验是否符合
    // if (!(value < max && value > min)) {
    //   Notify({ type: 'danger', message: '请检查您输入的身高' });
    //   this.setData({
    //     isRegesting: false
    //   })
    //   return;
    // }
    // if (this.data.weight == '') {
    //   Notify({ type: 'danger', message: '请输入您的体重数据' });
    //   this.setData({
    //     isRegesting: false
    //   })
    //   return
    // }
    // value = parseFloat(this.data.weight);
    // if (!(value < max && value > min)) {
    //   Notify({ type: 'danger', message: '请检查您输入的体重' });
    //   this.setData({
    //     isRegesting: false
    //   })
    //   return;
    // }
    
    Notify({ type: 'success', message: '信息校验通过' })
    // 信息校验完成，执行注册程序

    // 执行绑定手机号的操作
    try {
      // 优化：使用 await 直接接收结果，避免 then 嵌套
      const res = await bindPhoneNumber({ 
        openId: this.data.openId, 
        phoneCode: this.data.user.phoneNumber 
      });
      console.log('绑定手机号成功', res);
      if (res.code === 1) {
        // 错误分支：关闭加载状态
        wx.showModal({
          title: '绑定手机号错误',
          content: res.msg,
        });
        this.setData({ isRegesting: false });
        return;
      }
  
      // 成功分支：存储 token
      wx.setStorageSync("access_token", res.data.access_token);
      wx.setStorageSync("refresh_token", res.data.refresh_token);
      Notify({ type: 'success', message: '注册成功，正在保存信息...' });
  
      // 1. 先获取刚创建的用户信息（包含patientUid）
      await new Promise(resolve => setTimeout(resolve, 1500)); // 等待数据库提交
      await this.getUserInfo(); 
      console.log('获取注册后用户信息:', userBaseInfoState.data);
      
      // 2. 更新用户详细信息（姓名、性别、生日等）
      try {
        const updateResult: any = await this.modUserInfoAsync();
        console.log('用户信息更新结果:', updateResult);
        
        if (updateResult && updateResult.code === 0 && updateResult.data === true) {
          console.log('用户信息更新成功');
        } else {
          console.warn('用户信息更新返回false，可能未成功更新数据库');
        }
        
        // 保存用户信息到缓存（用于"我的"页面查询）
        wx.setStorageSync("patientUid", userBaseInfoState.data.patientUid);
        wx.setStorageSync("phoneNumber", userBaseInfoState.data.phoneNumber);
        console.log('已保存patientUid和phoneNumber到缓存');
        
        // 重新获取用户信息，确保数据库中的数据是最新的
        await new Promise(resolve => setTimeout(resolve, 500));
        await this.getUserInfo();
        console.log('重新获取用户信息后:', userBaseInfoState.data);
        
        // 打印用户信息用于调试
        console.log('========== 注册完成，用户信息如下 ==========');
        console.log('姓名 (patientName):', userBaseInfoState.data.patientName);
        console.log('手机号 (phoneNumber):', userBaseInfoState.data.phoneNumber);
        console.log('患者ID (patientUid):', userBaseInfoState.data.patientUid);
        console.log('性别 (sex):', userBaseInfoState.data.sex);
        console.log('生日 (birthday):', userBaseInfoState.data.birthday);
        console.log('微信ID (wxUid):', userBaseInfoState.data.wxUid);
        console.log('用户名 (username):', userBaseInfoState.data.username);
        console.log('==========================================');
      } catch (err) {
        console.error('用户信息更新失败', err);
        Notify({ type: 'warning', message: '部分信息保存失败，请稍后在"我的"页面完善' });
      }
      
      // 3. 添加BMI记录（暂时注释，不需要BMI功能）
      // try {
      //   const bmiResult: any = await this.addRecordAsync();
      //   if (bmiResult && !bmiResult.skipped && !bmiResult.error) {
      //     console.log('BMI记录添加成功');
      //   } else if (bmiResult && bmiResult.skipped) {
      //     console.log('跳过BMI记录');
      //   } else if (bmiResult && bmiResult.error) {
      //     console.log('BMI记录失败，但不影响注册');
      //   }
      // } catch (err) {
      //   console.error('BMI记录添加异常', err);
      // }
      
      // 4. 跳转到首页
      Notify({ type: 'success', message: '注册完成，即将进入首页' });
      await new Promise(resolve => setTimeout(resolve, 1500));
      wx.switchTab({ url: '/pages/home/index' });
    } catch (err) {
      // 失败分支：关闭加载状态
      console.log("绑定手机号失败", err);
      Notify({ type: 'danger', message: '绑定手机号失败，请重试' });
    } finally {
      // 无论成功/失败，最终都关闭加载状态（确保闭环）
      this.setData({ isRegesting: false });
    }
  },

  // 需要更新用户基本信息数据，所以需要重新获取
  async getUserInfo() {
    const data = <PatientBaseEntity>{ wxUid: wx.getStorageSync("openid") };
    
    // 关键：返回 Promise，让 await 可以等待
    return getPatientBaseObject(data)
      .then((res: any) => {
        console.log('获取基本信息成功', res);
        // 确保 res.data[0] 存在（避免赋值 undefined）
        if (res.data && res.data[0]) {
          userBaseInfoState.onChangeData(res.data[0]);
        } else {
          console.warn('获取的用户信息为空', res.data);
        }
        return res.data[0]; // 可选：返回数据，方便外部使用
      })
      .catch((err: any) => {
        console.log("获取基本信息失败", err);
        throw err; // 抛出错误，让外部 catch 可以捕获
      });
  },
  // onInput(event: any) {
  //   const { field } = event.currentTarget.dataset;
  //   userBaseInfoState.updateField(field, event.detail);
  //   this.setData({
  //     [`user.${field}`]: event.detail
  //   });
  // },

  onConfirm() {
    this.confirmInfo()
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad() {
    // userBaseInfoState.bind(this, '$userBase');
    // this.getUserInfo()
    const nowDate = new Date();
    this.setData({
      date: formatTime(nowDate, 'yyyy-MM-dd')
    })
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  }
})